package be.ipl.finito.servlets;

import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.exceptions.ArgumentInvalideException;
import be.ipl.finito.exceptions.JoueurDejaInscritException;
import be.ipl.finito.exceptions.JoueurInExistantException;
import be.ipl.finito.exceptions.PartieInExistanteException;
import be.ipl.finito.usecases.GestionJoueur;
import be.ipl.finito.usecases.GestionPartie;

public class Rejoindre extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	private GestionJoueur gestionJoueur;

	@EJB
	private GestionPartie gestionPartie;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		RequestDispatcher rd = null;
		if (req.getSession().getAttribute("pseudo") == null) {
			resp.sendRedirect("index.html");
			return;
		} else if (req.getSession().getAttribute("pseudo") != null
				&& req.getSession().getAttribute("idpartie") == null) {
			rd = getServletContext().getNamedDispatcher("acceuil.html");
			rd.forward(req, resp);
			return;
		}
		Joueur j = gestionJoueur.chercherJoueur((String) req.getSession().getAttribute("pseudo"));
		int idPartie = (Integer) req.getSession().getAttribute("idpartie");
		req.setAttribute("source", "rejoindre");
		Partie p = null;
		
		Calendar created = (Calendar) getServletContext().getAttribute(
				"time" + idPartie);
		if (created != null) {
			Calendar now = new GregorianCalendar();
			long rest = (Partie.TEMPS * 1000) + created.getTimeInMillis()
					- now.getTimeInMillis();
			req.setAttribute("time", Math.round((rest / 1000)));
		}

		try {
			p = gestionPartie.commencerPartie(idPartie, j);
			if (gestionPartie.estCommencee(idPartie)) {
				req.getSession().setAttribute("tour", 1);
				req.setAttribute("message", "Partie commence");
				req.setAttribute("pMessage", "messageOk");
				req.setAttribute("idpartie", idPartie);
				
				req.setAttribute("debut", true);
				//rd = getServletContext().getRequestDispatcher("/WEB-INF/jsp/plateau.jsp");
				rd = getServletContext().getNamedDispatcher("plateau.html");
				rd.forward(req, resp);
				return;
			} else if (gestionPartie.estAnnulee(idPartie)) {
				getServletContext().removeAttribute("partie");
				rd = getServletContext().getNamedDispatcher("index.html");
				req.setAttribute("annulee", true);
				rd.forward(req, resp);
				return;
			}
		} catch (PartieInExistanteException e) {
			e.printStackTrace();
		} catch (JoueurInExistantException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		rd = getServletContext().getRequestDispatcher(
				"/WEB-INF/jsp/attente.jsp");
		rd.forward(req, resp);

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		int idPartie = Integer.parseInt(req.getParameter("idpartie"));
		Partie partie;
		RequestDispatcher rd = null;
		try {
			partie = gestionPartie.chercherPartie(idPartie);
			Joueur j = gestionJoueur.chercherJoueur((String) req.getSession()
					.getAttribute("pseudo"));
			j = gestionJoueur.chargerPlateau(j);
			if (partie.getJoueurs().contains(j)) {
				req.setAttribute("message",
						"Vous avez déja rejoint la partie !");
				req.setAttribute("pMessage", "messagePasOk");
				this.getServletContext().getNamedDispatcher("index.html")
						.forward(req, resp);
				return;
			}
			if (gestionPartie.rejoindrePartie(idPartie, j) != null) {
				req.getSession().setAttribute("idpartie", idPartie);
				req.setAttribute("source", "rejoindre");
				Calendar created = (Calendar) getServletContext().getAttribute(
						"time" + idPartie);
				if (created != null) {
					Calendar now = new GregorianCalendar();
					long rest = (Partie.TEMPS * 1000) + created.getTimeInMillis()
							- now.getTimeInMillis();
					req.setAttribute("time", Math.round((rest / 1000)));
				}
				rd = getServletContext().getRequestDispatcher(
						"/WEB-INF/jsp/attente.jsp");
				rd.forward(req, resp);
				return;
			}
		} catch (PartieInExistanteException e) {
			e.printStackTrace();
		} catch (JoueurInExistantException e) {
			e.printStackTrace();
		} catch (JoueurDejaInscritException e) {
			e.printStackTrace();
		} catch (ArgumentInvalideException e) {
			e.printStackTrace();
		}
		rd = getServletContext().getNamedDispatcher("index.html");
		rd.forward(req, resp);

	}

}
